﻿/**********************************************************************
 * @file   GUISpectraDialogBase.h
 * @brief  频谱窗口基类
 * @author BaGuijun (baguijun@163.com)
 * @date   2024-12-05
 *********************************************************************/
#ifndef GUISpectraDialogBase_H
#define GUISpectraDialogBase_H

#include "GUIPhyscisDialogAPI.h"
#include "GUIWidget/GUIDialogBase.h"

#include "FITK_Component/FITKAcousticsPhysics/FITKAcousticsAbstractSpectra.h"

namespace Ui {
    class GUISpectraDialogBase;
}
namespace Acoustics {
    class FITKAcousticsAbstractSpectra;
    class FITKAcousticsSpectraManager;
}
namespace EventOper {
    class ParaWidgetInterfaceOperator;
}

class QwtPlotCurve;
class QwtPlot;

namespace GUI
{
    class QwtCustomPlot;
    /**
     * @brief  频谱窗口基类
     * @author BaGuijun (baguijun@163.com)
     * @date   2024-12-06
     */
    class GUIPhyscisDialogAPI GUISpectraDialogBase : public GUIDialogBase
    {
        Q_OBJECT;
    public:
        /**
         * @brief    构造函数
         * @param[i] spectraDataID      频谱对象ID
         * @param[i] oper               操作器
         * @param[i] isCreate           是否是创建模式
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-05
         */
        explicit GUISpectraDialogBase(int spectraDataID, bool isCreate);
        /**
         * @brief    析构函数
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-05
         */
        virtual ~GUISpectraDialogBase();
        /**
         * @brief    设置曲线Y轴标题
         * @param[i] title              标题
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-10
         */
        void setPlotYTitle(const QString& title);
    protected:
        /**
         * @brief    将数据设置至界面信息
         * @param[i] data        数据对象
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-09
         */
        virtual void setDataToWidget(Acoustics::FITKAcousticsAbstractSpectra* data);
        /**
         * @brief    将界面信息存储至数据
         * @param[i] data        数据对象
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-09
         */
        virtual void getDataFromWidget(Acoustics::FITKAcousticsAbstractSpectra* data);
        /**
         * @brief    初始化函数[虚函数]
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-05
         */
        virtual void init();
        /**
         * @brief   初始化曲线
         * @author  XingXuanCi (xingxuanci@diso.cn)
         * @date    2024-11-12
         */
        void initCustomPlot();
        /**
         * @brief   初始化信号槽连接
         * @author  XingXuanCi (xingxuanci@diso.cn)
         * @date    2024-11-12
         */
        void initConnect();
        /**
         * @brief    更新Form类型
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-06
         */
        virtual void upateFormType() = 0;
        /**
         * @brief    更新赫兹数据
         * @param[i] list        赫兹列表
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-06
         */
        void updateHzValue(QList<Acoustics::SpectraValue> HzList);
        /**
         * @brief    获取界面赫兹数据
         * @return   QList<Acoustics::SpectraValue>      赫兹列表
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-10
         */
        QList<Acoustics::SpectraValue> getUiHzValue();
        /**
         * @brief    获取当前的频谱数据
         * @return   Acoustics::FITKAcousticsAbstractSpectra*     频谱数据
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-06
         */
        Acoustics::FITKAcousticsAbstractSpectra* getCurrentSpectraData();
        /**
         * @brief    获取当前的频谱界面数据
         * @return   Acoustics::FITKAcousticsAbstractSpectra*     频谱数据
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-06
         */
        Acoustics::FITKAcousticsAbstractSpectra* getCurrentSpectraUiData();
        /**
         * @brief    更新图标窗口Y轴标题
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-10
         */
        virtual void updatePlotYTitle() = 0;
        /**
         * @brief    更新曲线
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-11
         */
        virtual void updatePlot();
        /**
         * @brief    更新零DB单位
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-12
         */
        virtual void updateZeroDBUnit();
        /**
         * @brief    更新Constant与RealValue单位
         * @param[i] unit                     单位
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-12
         */
        virtual void updateConstantAndRealValueUnit(const QString& unit);
        /**
         * @brief    正向计算
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-10
         */
        virtual void frontCalculate();
        /**
         * @brief    反向计算
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-13
         */
        virtual void backCalculate();
        /**
         * @brief    创建新频谱对象
         * @return   Acoustics::FITKAcousticsAbstractSpectra*     频谱对象
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-11
         */
        virtual Acoustics::FITKAcousticsAbstractSpectra* createNewSpectra() = 0;
        /**
         * @brief    更新表格界面
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-11
         */
        void updateTableWidget();
        /**
         * @brief    更新零DB界面
         * @param[i] isUseZeroDB         是否自定义
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-12
         */
        void updateZeroDBWidget(bool isUseDefined);
        /**
         * @brief    设置曲线界面标题
         * @param[i] title               标题
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-12
         */
        void setPlotTitle(const QString& title);
        /**
         * @brief    修改界面实部数据
         * @param[i] real                实部数据
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-13
         */
        void changeUiRealValue(const double& real);
        /**
         * @brief    PSD按钮点击
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-12
         */
        virtual void radioPSDClickEvent();
    //    /**
    //     * @brief   启用或禁用 UI 控件
    //     * @param   enabled 表示是否启用控件
    //     * @author  XingXuanCi (xingxuanci@diso.cn) (XingXuanCi (xingxuanci@diso.cn)@diso.cn)
    //     * @date    2024-11-25
    //     */
    //    void setDBClickedUiWidgetEnable(bool enabled);
    //    /**
    //     * @brief   通过频谱类型获取对应的文本
    //     * @param   t 频谱类型
    //     * @return  返回对应的频谱名称文本
    //     * @author  XingXuanCi (xingxuanci@diso.cn) (XingXuanCi (xingxuanci@diso.cn)@diso.cn)
    //     * @date    2024-11-25
    //     */
    //    QString getNamebyFormType(Acoustics::FITKAcousticsAbstractSpectra::AcousticsSpectraForm t);
    //    /**
    //     * @brief   获取当前选中 radio
    //     * @return  返回当前的频谱形式计算类型
    //     * @author  XingXuanCi (xingxuanci@diso.cn) (XingXuanCi (xingxuanci@diso.cn)@diso.cn)
    //     * @date    2024-11-25
    //     */
    //    Acoustics::FITKAcousticsAbstractSpectra::AcousticsSpectraFormCalculateType getCurrentRadioType();
    //    /**
    //     * @brief   获取当前UI的频谱值
    //     * @return  返回当前频谱值列表
    //     * @author  XingXuanCi (xingxuanci@diso.cn) (XingXuanCi (xingxuanci@diso.cn)@diso.cn)
    //     * @date    2024-11-25
    //     */
    //    QList<Acoustics::SpectraValue> getCurrentSpectraValue();
    protected slots:
        ;
        /**
         * @brief    Ok按钮点击事件
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-11
         */
        void slot_OK();
        /**
         * @brief    取消按钮点击事件
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-11
         */
        void slot_Cancel();
        /**
         * @brief slot_import 导入文件
         */
        void slot_import();
        /**
         * @brief    名称修改槽函数
         * @author   BaGuijun (baguijun@163.com)
         * @date     2025-01-21
         */
        void slot_nameEdit();
        /**
         * @brief    A权重按钮点击事件
         * @param[i] checked           是否选中
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-10
         */
        void slot_AWeightingClicked(bool checked);
        /**
         * @brief    dB按钮点击事件
         * @param[i] checked        是否选中
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-10
         */
        void slot_dBClicked(bool checked);

        /**
         * @brief   应用db
         * @author  XingXuanCi (xingxuanci@diso.cn)
         * @date    2024-11-12
         */
        void slot_applyZeroDB();
        /**
         * @brief    零DB默认按钮点击事件
         * @param[i] checked              是否选中
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-10
         */
        void slot_radioDefault(bool checked);
        /**
         * @brief    零DB自定义按钮点击事件
         * @param[i] checked              是否选中
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-10
         */
        void slot_radioUserDefault(bool checked);
        /**
         * @brief   应用Constant real
         * @author  XingXuanCi (xingxuanci@diso.cn)
         * @date    2024-11-12
         */
        void slot_applyConstant();
        /**
         * @brief   Constant状态
         * @param[i]   checked 是否选中
         * @author  XingXuanCi (xingxuanci@diso.cn)
         * @date    2024-11-12
         */
        void slot_rtnConstant(bool checked);

        /**
         * @brief   设置X轴log 或 linear状态
         * @param[i]   checked 是否选中
         * @author  XingXuanCi (xingxuanci@diso.cn)
         * @date    2024-11-12
         */
        void slot_xAxisLogOrLinear(bool checked);
        /**
         * @brief   设置y轴log 或 linear状态
         * @param[i]   checked 是否选中
         * @author  XingXuanCi (xingxuanci@diso.cn)
         * @date    2024-11-12
         */
        void slot_yAxisLogOrLinear(bool checked);
        /**
         * @brief    表格单元格文本改变
         * @param[i]   row 改变的行
         * @param[i]   column 改变的列
         * @author  XingXuanCi (xingxuanci@diso.cn)
         * @date    2024-11-12
         */
        void slot_tableCellChanged(int row, int column);
        /**
         * @brief    PSD按钮点击
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-12
         */
        void slot_radioPSD();
    protected:
        /**
         * @brief   UI
         * @author  XingXuanCi (xingxuanci@diso.cn)
         * @date    2024-11-12
         */
        Ui::GUISpectraDialogBase* _ui = nullptr;
        /**
         * @brief  频谱对象id
         * @author BaGuijun (baguijun@163.com)
         * @date   2024-12-05
         */
        int _spectraDataID = -1;
        /**
         * @brief  频谱界面对象id
         * @author BaGuijun (baguijun@163.com)
         * @date   2024-12-05
         */
        int _spectraUiDataID = -1;
        /**
         * @brief  是否是创建模式
         * @author BaGuijun (baguijun@163.com)
         * @date   2024-12-05
         */
        bool _isCreate = false;
        /**
         * @brief  RSM单位
         * @author XingXuanCi (xingxuanci@diso.cn)
         * @date   2024-11-12
         */
        QString _RSMUnit = "";
        /**
         * @brief  频谱管理器
         * @author BaGuijun (baguijun@163.com)
         * @date   2024-12-10
         */
        Acoustics::FITKAcousticsSpectraManager* _spectraManager = nullptr;
        /**
         * @brief  ui界面当前的零DB数值
         * @author BaGuijun (baguijun@163.com)
         * @date   2024-12-11
         */
        double _uiCurrentZeroDBValue = 1.0;
        /**
         * @brief   qwt曲线窗口指针
         * @author  XingXuanCi (xingxuanci@diso.cn)
         * @date    2024-11-12
         */
        QwtCustomPlot* _plot = nullptr;
        /**
         * @brief   曲线指针
         * @author  XingXuanCi (xingxuanci@diso.cn)
         * @date    2024-11-12
         */
        QwtPlotCurve* _curve = nullptr;
    };
}
#endif // GUISpectraDialogBase_H
